<?php

declare(strict_types=1);

namespace App\Exception\Handler;

use App\Constants\ErrorCode;
use App\Exception\BusinessException;
use App\Kernel\Http\Response;
use App\Utils\Log;
use Hyperf\Contract\StdoutLoggerInterface;
use Hyperf\ExceptionHandler\ExceptionHandler;
use Hyperf\Validation\ValidationException;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ResponseInterface;
use Throwable;

class BusinessExceptionHandler extends ExceptionHandler
{
    /**
     * @var ContainerInterface
     */
    protected $container;

    /**
     * @var Response
     */
    protected $response;

    /**
     * @var StdoutLoggerInterface
     */
    protected $logger;

    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
        $this->response = $container->get(Response::class);

        $this->logger = $container->get(StdoutLoggerInterface::class);
    }

    public function handle(Throwable $throwable, ResponseInterface $response)
    {
        var_dump("服务器内部错误");
//        var_dump($throwable);
//        var_dump($response);
        if ($throwable instanceof BusinessException) {
            env('APP_ENV') != 'prod' && $this->logger->warning((string) $throwable);
            return $this->response->fail($throwable->getCode(), $throwable->getMessage());
        }

        if ($throwable instanceof ValidationException) {
            $message = $throwable->validator->errors()->first();
            env('APP_ENV') != 'prod' && $this->logger->warning($message . $throwable);
            return $this->response->fail(ErrorCode::PARAMS_INVALID, $message);
        }

        env('APP_ENV') != 'prod' && $this->logger->error((string) $throwable);

        return $this->response->fail(ErrorCode::SERVER_ERROR, '服务器内部错误');
    }

    public function isValid(Throwable $throwable): bool
    {
        return true;
    }
}